# pathlib --- 面向对象的文件系统路径

# 主类Path
from pathlib import Path, PureWindowsPath, PurePath, PurePosixPath

p = Path('D:\SourceCode\original_tools')
# 列出子目录
print([x for x in p.iterdir() if
       x.is_dir()])  # [WindowsPath('D:/SourceCode/original_tools/.idea'), WindowsPath('D:/SourceCode/original_tools/built_in'), WindowsPath('D:/SourceCode/original_tools/gen_pass'), WindowsPath('D:/SourceCode/original_tools/md_to_pdf'), WindowsPath('D:/SourceCode/original_tools/pyqt-test'), WindowsPath('D:/SourceCode/original_tools/venv')]

# 查询当前目录下所有 py 文件
print(list(p.glob(
    '*.py')))  # [WindowsPath('D:/SourceCode/original_tools/80s_spider.py'), WindowsPath('D:/SourceCode/original_tools/create_catelog.py'), WindowsPath('D:/SourceCode/original_tools/create_time_excel.py'), WindowsPath('D:/SourceCode/original_tools/funcs.py'), WindowsPath('D:/SourceCode/original_tools/gen_boss_table.py'), WindowsPath('D:/SourceCode/original_tools/mqtt_pub_tst.py'), WindowsPath('D:/SourceCode/original_tools/mqtt_sub_tst.py'), WindowsPath('D:/SourceCode/original_tools/panbaidu_file.py'), WindowsPath('D:/SourceCode/original_tools/panbaidu_upload.py'), WindowsPath('D:/SourceCode/original_tools/qiushibaike.py'), WindowsPath('D:/SourceCode/original_tools/rename.py'), WindowsPath('D:/SourceCode/original_tools/shengke-config.py'), WindowsPath('D:/SourceCode/original_tools/trie.py'), WindowsPath('D:/SourceCode/original_tools/try.py'), WindowsPath('D:/SourceCode/original_tools/tst.py'), WindowsPath('D:/SourceCode/original_tools/xunbo_spider.py')]

# 运算符 / 等价于 os.path.join()
q = p / 'built_in'

# 目录进行移动
print(q, q.resolve())  # D:\SourceCode\original_tools\built_in D:\SourceCode\original_tools\built_in
print(Path('yasuo/tst/bar').resolve()) # D:\SourceCode\original_tools\built_in\bar

# 路径属性
print(q.exists(), q.is_dir())  # True True

# PurePath纯路径类
print(PurePath('tst.py'), PurePath())  # tst.py .
print(PurePath('D:/SourceCode', '/original_tools'))  # D:\original_tools
print(str(PureWindowsPath('d:/SourceCode')))  # d:\SourceCode

# 访问个别部分
p_u = PurePath('/usr/local/src')
print(p_u.parts)  # ('\\', 'usr', 'local', 'src')

# 驱动器盘符
print(PurePath("D:/SourceCode").drive)  # D:
print(PureWindowsPath('/foo.txt.txt').drive)  # ''
print(PureWindowsPath('//host/share/foo.txt.txt').drive)  # \\host\share

# 表示（本地或全局）根的字符串
print(PureWindowsPath('D:/SourceCode/').root)  # \
print(PureWindowsPath('//host/share').root)  # \
print(PurePosixPath('/etc').root)  # /

# 驱动器与根结合
print(PureWindowsPath('c:/Program Files/').anchor)  # c:
print(PureWindowsPath('//host/share').anchor)  # \\host\share\
print(PurePosixPath('/etc').anchor)  # /

# 父路径列表
p_w = PureWindowsPath('D:/SourceCode/original_tools/funcs.py')
print(list(
    p_w.parents))  # [PureWindowsPath('D:/SourceCode/original_tools'), PureWindowsPath('D:/SourceCode'), PureWindowsPath('D:/')]
print(p_w.parents[0])  # D:\SourceCode\original_tools
print(p_w.parents[1])  # D:\SourceCode
print(p_w.parents[2])  # D:

# 逻辑父路径
print(p_w.parent)  # D:\SourceCode\original_tools

# 最后路径组件的名称，排除驱动器与根目录
print(p_w.name, p_w.suffix, p_w.suffixes, p_w.stem)  # funcs.py .py ['.py'] funcs

# 返回使用反斜杠(/)的路径字符串
p = PureWindowsPath('c:\\windows')
print(str(p), p.as_posix())  # c:\windows c:/windows

print(p.as_uri())  # file:///c:/windows

# 判断路径是否为绝对路径
print(PureWindowsPath('c:/a/b').is_absolute())  # True
print(PurePosixPath('a/b').is_absolute())  # False
print(PurePosixPath('/a/b').is_absolute())  # True

# 在 PureWindowsPath，如果路径是被 Windows 保留的则返回 True，否则 False。在 PurePosixPath，总是返回 False
print(PureWindowsPath('nul').is_reserved())  # True
print(PurePosixPath('nul').is_reserved())  # False

# 将每个 other 参数中的项目连接在一起
print(PurePosixPath('/etc').joinpath('passwd'))  # /etc/passwd
print(PureWindowsPath('D:').joinpath('/SourceCode/'))  # D:\SourceCode

# 将此路径与提供的通配符风格的模式匹配
print(PurePath('a/b/c.py').match('*.py'))  # True
print(PurePath('a/b/c.py').match('b/*.py'))  # True
print(PurePath('a/b/c.py').match('a/*.py'))  # False

# 计算此路径相对 other 表示路径的版本
print(p_u.relative_to('/'))  # usr\local\src
print(p_u.relative_to('/usr'))  # local\src

# 返回一个新的路径并修改 name
print(p_w.with_name('example.ini'))  # D:\SourceCode\original_tools\example.ini

# 返回一个带有修改后 stem 的新路径
print(p_w.with_suffix('.bz2'))  # D:\SourceCode\original_tools\funcs.bz2

# 具体路径
# 表示当前目录的路径对象
print(Path.cwd())  # D:\SourceCode\original_tools\built_in

# 表示当前用户家目录的新路径对象
print(Path.home())  # C:\Users\m1761

# 返回一个 os.stat_result 对象，其中包含有关此路径的信息
p = Path('D:\SourceCode\original_tools\example.ini')
# 大小
print(p.stat().st_size)  # 280
# 创建时间
print(p.stat().st_atime)  # 1628474064.2820358
# 模式与权限
print(p.stat().st_mode)  # 33206
p.chmod(0o444)
print(p.stat().st_mode)  # 33060
# 路径是否存在
print(Path('.').exists())  # True

# 解析相对于此路径的通配符 pattern，产生所有匹配的文件
print(sorted(Path('.').glob(
    '*.py')))  # [WindowsPath('array-test.py'), WindowsPath('bisect-test.py'), WindowsPath('collections-test.py'), WindowsPath('const.py'), WindowsPath('decimal-test.py'), WindowsPath('enum-test.py'), WindowsPath('functions.py'), WindowsPath('functools-test.py'), WindowsPath('graphlib-test.py'), WindowsPath('heapq-test.py'), WindowsPath('itertool-test.py'), WindowsPath('math-cmath-test.py'), WindowsPath('operator-test.py'), WindowsPath('pathlib-test.py'), WindowsPath('re-test.py'), WindowsPath('time-test.py')]

# 判断是否为文件夹
print(p.is_dir(), p.is_file())  # False True

# 如果路径指向符号链接则返回 True
print(p.is_symlink())  # False
# 是否为socket文件
print(p.is_socket())  # False

# 如果路径指向一个先进先出存储（或者指向先进先出存储的符号链接）则返回 True ，指向其他类型的文件则返回 False
print(p.is_fifo())  # False

# 如果文件指向一个块设备（或者指向块设备的符号链接）则返回 True
print(p.is_block_device())  # False

# 如果路径指向一个字符设备（或指向字符设备的符号链接）则返回 True
print(p.is_char_device())

# 迭代该路径
print(p.iterdir())  # <generator object Path.iterdir at 0x0000020FA0007830>
for i in Path("D:\SourceCode\original_tools").iterdir():
    print(i)  # 列出所有文件

print(p.read_bytes())

p = Path('foo.txt')
# p.open('w').write('some text')
target = Path('bar')
# p.rename(target)
# print(target.open().read())  # some text

print(sorted(Path('.').rglob(
    '*.py')))  # [WindowsPath('array-test.py'), WindowsPath('bisect-test.py'), WindowsPath('collections-test.py'), WindowsPath('const.py'), WindowsPath('decimal-test.py'), WindowsPath('enum-test.py'), WindowsPath('functions.py'), WindowsPath('functools-test.py'), WindowsPath('graphlib-test.py'), WindowsPath('heapq-test.py'), WindowsPath('itertool-test.py'), WindowsPath('math-cmath-test.py'), WindowsPath('operator-test.py'), WindowsPath('pathlib-test.py'), WindowsPath('re-test.py'), WindowsPath('time-test.py')]
